<template>
  <div class="search">
    <van-nav-bar
      title="搜索中心"
      left-arrow
      @click-left="$router.back()"
    ></van-nav-bar>

    <!-- 搜索框 -->
    <van-search
      v-model="keyword"
      show-action
      shape="round"
      placeholder="请输入搜索关键词"
      @input="inputFn"
      @search="onSearch(keyword)"
    >
      <template #action>
        <div @click="onSearch(keyword)">搜索</div>
      </template>
    </van-search>

    <!-- 推荐 -->
    <van-cell-group v-if="keyword">
      <van-cell
        icon="search"
        v-for="(item, i) in sugList"
        :key="i"
        @click="onSearch(item)"
      >
        <!-- title在标签里没办法渲染 用span放里面 -->
        <span v-html="highLight(item, keyword)"></span>
      </van-cell>
    </van-cell-group>

    <!-- 历史记录 -->
    <van-cell-group v-else>
      <van-cell title="历史记录"></van-cell>
      <van-cell
        :title="item"
        v-for="(item, i) in history"
        :key="i"
        @click="onSearch(item)"
      >
        <van-icon name="close" @click.stop="del(item)" />
      </van-cell>
    </van-cell-group>
    <van-empty
      image="search"
      description="无结果"
      v-show="keyword && sugList.length === 0"
    />
  </div>
</template>

<script>
import { getSuggestion } from '@/api/search'
import { getStorageHistory, setStorageHistory } from '@/utils/storage'
export default {
  name: 'Search',
  data() {
    return {
      keyword: '',
      sugList: [],
      // 历史记录从本地存储去拿
      history: getStorageHistory()
    }
  },
  methods: {
    onSearch(item) {
      // !若未输入搜索内容，则提示
      if (!item) return this.$toast('请输入搜索内容')
      // 将搜索的历史记录放到数组里并且去重(另外还需要做本地存储)
      // !先删后加再存到本地
      this.history = this.history.filter((v) => v !== item)
      this.history.unshift(item)
      setStorageHistory(this.history)
      // todo 点击搜索，回车搜索，点击推荐某个  都需要跳到搜索结果页面
      this.$router.push({
        path: '/search/result',
        query: {
          // 通过query来携带参数(path不能和params配合使用)
          keyword: item
        }
      })
    },
    // 输入事件，发送请求获取联想建议
    inputFn() {
      clearTimeout(this.timeId)
      this.timeId = setTimeout(async () => {
        // 如果输入框没有内容则return
        if (!this.keyword) return
        const res = await getSuggestion(this.keyword)
        console.log(res)
        // !如果接口返回没有数据，避免报错
        if (res.data.options[0] === null) {
          return (this.sugList = [])
        }
        this.sugList = res.data.options
      }, 300)
    },
    // 封装高亮函数
    highLight(str, keyword) {
      const reg = new RegExp(keyword, 'gi')
      return str.replace(
        reg,
        (item) => `<span style="color:red">${item}</span>`
      )
    },
    // 删除历史记录
    del(item) {
      this.history = this.history.filter((v) => v !== item)
      // 删除之后记得存储
      setStorageHistory(this.history)
    }
  }
}
</script>

<style></style>
